home *** CD-ROM | disk | FTP | other *** search
- /* meta.c */
-
- /* JOVE/MSDOS. K. Mitchum 1/85 */
- /* Modifications for personal use only. */
- /* original code J. Payne LSRHS 5/83 */
- /* Ken Mitchum */
- /* University of Pittsburgh */
- /* Decision Systems Laboratory */
-
- /*
- Jonathan Payne at Lincoln-Sudbury Regional High School 5-25-83
-
- jove_meta.c
-
- Various commands that are (by default) invoked by ESC-key.
- Not a very good name since the ESC key can be rebound... */
-
-
- #include "jove.h"
-
- #ifdef UNIX
- #include <ctype.h>
- #endif
-
- extern int RMargin;
- extern int diffnum;
-
-
-
- PrefAbort(str)
- char *str;
- {
- s_mess("%s aborted", str);
- rbell();
- }
-
- Unknown(pref, c)
- char pref,
- c;
- {
- s_mess("%c-%c unbound", pref, c);
- rbell();
- }
-
- Upperc(c)
- register int c;
- {
- return (islower(c) ? toupper(c) : c);
- }
-
- FourTime()
- {
- exp_p = 1;
- exp *= 4;
- this_cmd = ARG_CMD;
- }
-
- EscPrefix()
- {
- register int c, i, sign;
- FUNCT *mp;
- int invokingchar = LastKeyStruck;
-
- c = (*Gtchar)();
-
- if (c == CTL(G)) {
- PrefAbort("Prefix-1");
- return;
- }
-
- if (c == '-' || (c >= '0' && c <= '9')) {
- sign = c == '-' ? -1 : 1;
- if (sign == 1)
- i = c - '0';
- else
- i = 0;
- for (;;) {
- c = (*Gtchar)();
- if (c >= '0' && c <= '9')
- i = i * 10 + (c - '0');
- else {
- exp_p = 1;
- exp = i * sign;
- peekc = c;
- this_cmd = ARG_CMD;
- return;
- }
- }
- }
-
- mp = pref1map[c];
- if (mp == 0)
- Unknown(invokingchar, c);
- ExecFunc(mp, 0);
- }
-
- /*
- * Save a region. A pretend kill.
- */
-
- CopyRegion()
- {
- LINE *nl;
- MARK *mp;
- int status,
- mod = curbuf->b_modified;
-
- mp = CurMark();
-
- if (mp->m_line == curline && mp->m_char == curchar)
- complain((char *) 0);
-
- killptr = ((killptr + 1) % NUMKILLS);
- if (killbuf[killptr])
- lfreelist(killbuf[killptr]);
- nl = killbuf[killptr] = nbufline();
- nl->l_dline = putline("");
- nl->l_next = nl->l_prev = 0;
-
- status = inorder(mp->m_line, mp->m_char, curline, curchar);
- if (status == -1)
- return;
-
- if (status)
- ignore(DoYank(mp->m_line, mp->m_char, curline, curchar,
- nl, 0, (BUFFER *) 0));
- else
- ignore(DoYank(curline, curchar, mp->m_line, mp->m_char,
- nl, 0, (BUFFER *) 0));
- curbuf->b_modified = mod;
- }
-
- DelNWord()
- {
- dword(1);
- }
-
- DelPWord()
- {
- dword(0);
- }
-
- dword(forward)
- {
- BUFLOC savedot;
-
- DOTsave(&savedot);
- forward ? ForWord() : BackWord();
- reg_kill(savedot.p_line, savedot.p_char, curline, curchar, !forward);
- }
-
- UppWord()
- {
- case_word(1);
- }
-
- LowWord()
- {
- case_word(0);
- }
-
- ToIndent()
- {
- register char *cp, c;
-
- for (cp = linebuf; c = *cp; cp++)
- if (c != ' ' && c != '\t')
- break;
- curchar = cp - linebuf;
- }
-
- GoLine()
- {
- if (exp_p == 0)
- return;
- SetLine(next_line(curbuf->b_zero, exp - 1));
- }
-
- VtKeys()
- {
- int c = getch();
-
- switch (c) {
- case 'A':
- PrevLine();
- break;
-
- case 'B':
- NextLine();
- break;
-
- case 'D':
- BackChar();
- break;
-
- case 'C':
- ForChar();
- break;
-
- default:
- complain("Unknown command ESC-[-%c", c);
- }
- }
-
-
-
- Justify()
- {
- BUFLOC *bp;
- LINE *start,
- *end;
- char *ParaStr = "^\\.\\|^$";
-
- bp = dosearch(ParaStr, -1, 1); /* Beginning of paragraph */
- if (bp) /* Not the tab case */
- start = bp->p_line->l_next;
- else
- start = curbuf->b_zero;
- bp = dosearch(ParaStr, 1, 1); /* End of paragraph */
- if (bp)
- end = bp->p_line;
- else
- end = curbuf->b_dol;
- DoJustify(start, end);
- }
-
-
-
- DoJustify(l1, l2) /* Justify text */
- LINE *l1,
- *l2;
- {
- int d1 = 0,
- d2 = 1,
- goal,
- nlines, /* Number of lines to justify
- * so we know when we are done.
- */
- curcol;
- char *cp;
- MARK *savedot = MakeMark(curline, curchar);
-
- fixorder(&l1, &d1, &l2, &d2); /* l1/c1 will be before l2/c2 */
- nlines = diffnum;
- SetLine(l1);
-
- if (lastp(l2) && !blnkp(getline(l2->l_dline, genbuf)))
- nlines++;
-
- while (nlines) { /* One line at a time */
- goal = RMargin - (RMargin / 10);
- Eol(); /* End of line */
- if ((curcol = calc_pos(linebuf, curchar)) == 0) {
- SetLine(curline->l_next); /* Skip blank lines */
- nlines--;
- } else if (curcol < goal) {
- if (nlines == 1)
- break;
- DelWtSpace(); /* No white space at the end of the line */
- DelNChar(); /* Delete carraige return */
- nlines--;
- Insertc(' ');
- } else if (curcol > RMargin) {
- do {
- /* curchar - 2 because curchar is the null,
- * curchar - 1 is the space (if there is
- * one there.
- */
- cp = StrIndex(-1, linebuf, curchar - 2, ' ');
- if (cp == 0)
- break;
- curchar = cp - linebuf;
- curcol = calc_pos(linebuf, curchar);
- } while (curcol > RMargin);
- if (cp) {
- DelWtSpace();
- LineInsert();
- } else {
- SetLine(curline->l_next);
- nlines--;
- }
- } else {
- SetLine(curline->l_next);
- nlines--;
- }
- }
- ToMark(savedot); /* Back to where we were */
- DelMark(savedot); /* Free up the mark */
- this_cmd = 0; /* So everything is under control */
- }
-
- /* end */